/**
 *	@class
 *	Event Singleton.
 *
 *	Evt é uma instância única no sistema que gerencia o registro e
 *	execução de eventos na camada lógica do sistema.
 *	Os eventos podem ter um escopo (namespace), e inclusive pode-se escutar
 *	um evento para um escopo específico, independente do nome do evento em si.
 */
var Evt = new function() {
	this.listener = new Object ();
	this.defScope = 'GLOBAL';

	/**
	 *	Método executado para disparar um evento no sistema.
	 *	@param scope Escopo ao qual o evento pertence (opcional)
	 *	@param name Nome do evento a ser disparado
	 *	@param data Dados a serem enviados junto com o evento
	 */
	this.fire = function(args) {
		if (!args.scope)
			args.scope = this.defScope;

		var evts = this.listener[args.scope];

		for (evtName in evts) {
			for (var i = (evts[evtName].length - 1); i >= 0; i--) {
				var evt = evts[evtName][i];

				if (evt.listenNSEvents === true || evtName == args.name) {
					evt.obj[evt.method].call (obj, args.data);
				}
			}
		}
	}

	/**
	 *	Método para registro dos eventos que deseja escutar
	 *	@param scope Escopo ao qual o evento pertence (opcional)
	 *	@param listenNSEvents 'true' se deseja escutar o evento indepentende do nome, dependendo apenas do escopo
	 *	@param name Nome do evento que deseja escutar
	 *	@param obj Objeto ao qual o método fornecido será executado.
	 *	@param method Método fornecido para execução quando houver o evento
	 */
	 this.listen = function(args) {
		if (!args.scope)
			args.scope = this.defScope;

		if (!args.listenNSEvents)
			args.listenNSEvents = false;

		if (!this.listener[args.scope])
			this.listener[args.scope] = new Object ();

		if (!this.listener[args.scope][args.name])
			this.listener[args.scope][args.name] = new Array ();

		this.listener[args.scope][args.name].push ({
			obj             : args.obj
			,method         : args.method
			,listenNSEvents : args.listenNSEvents
		});
	}
}
